// https://juejin.cn/post/7151926103324983304
let something:any = 'HelloWorld' // 将一个变量赋值为any类型时，Typescript编译器将不会对它进行类型检查，这意味着可以对any类型的变量执行任何操作，包括获取不存在的属性、调用不存在的函数等，而不会产生编译时错误

something = 18 // ok
something = true // ok
something.notExistMethod() // ok
something.notExistProperty.name // ok

let vAny:any = "Hello World"
let vUnknown: unknown = "Hello World"

let vNumberForAny: number = vAny // ok any可以直接赋值给其它任意类型
let vNumberForUnknow:number = vUnknown // error unknown 不可以直接赋值给其它非any和unknow类型的对象，unkonwn是any类型的一个更安全的替代品

vAny.toLocaleLowerCase() // ok! any 可以访问所有的属性
vUnkonwn.toLocaleLowerCase() // error vUnknown对象不可以直接访问上面的属性
// unknown 基本可以代替any，所以任何使用any的场景都应该优先使用unknown
// 什么时候可以使用unknown，需要先推断出对象的类型，才能使用

// never 类型收缩，用在无限循环或者仅抛出错误的函数中, 另外做一个类型的收缩  参考001never


let vVoid:void = undefined // 不能是null，只能是undefined

// 更加常见的使用常见表示没有任何返回值

// null和undefined是所有类型的子类型

// null和undefined的区别
// https://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html